package tp.pr5.mv.instructions.io;

import tp.pr5.mv.Instruction;
import tp.pr5.mv.Memory;
import tp.pr5.mv.Opcode;
import tp.pr5.mv.OperandStack;
import tp.pr5.mv.ProgramCounter;
import tp.pr5.mv.inout.InMethod;
import tp.pr5.mv.inout.OutMethod;
import tp.pr5.mv.traps.MVTrap;
import tp.pr5.mv.traps.WithoutOperandsEx;

public class OUT extends Instruction {

	public OUT() {		
		op = Opcode.OUT;
	}
	
	public void execute(OperandStack stack, Memory mem, ProgramCounter pc, InMethod inMethod, OutMethod outMethod) throws MVTrap {
	
		if ( stack.isEmpty() )    // Necesitamos al menos un operando en la pila.
			throw new WithoutOperandsEx( this, stack.getCounter() );
		
		
		try{
			char c = (char) stack.top();     // Cogemos la cima de la pila.
			stack.pop();
			outMethod.writeChar(c);          // Lo escribimos y si no se puede escribir se lanza IOException.
		}
		catch (java.io.IOException ex){
			throw new MVTrap( ex, "Error de escritura.");
		}
		
			
	}

	
	


	
	
}
